#include "bmp.h"
#include "ev.h"
 
/*
	图片显示函数
	解析并显示pic图片
	先读取 BMP 文件的头部信息(宽度、高度和颜色深度)
	然后读取图片的像素数据
	将其转换为合适的颜色格式，并调用 Display 函数将每个像素点显示出来。
*/


int Dis_pic(char *pic)
{
	//打开pic图片文件
	int fd = open(pic,O_RDONLY);
	if(-1 == fd)
	{
		perror("open error");
		return -1;
	}
	/*
		定义并访问图片的位图宽度,位图高度和色深
	*/
	int width,height;
	short depth;
	//将光标定位到0x12,即位图宽度访问处
	lseek(fd,0x12,SEEK_SET);
	//读图片文件的宽度
	read(fd,&width,4);
	//读图片文件的高度
	read(fd,&height,4);
	//将光标定位到0x1c,即图像的色深(每个像素所占位数)访问处
	lseek(fd,0x1c,SEEK_SET);
	//读图片的色深
	read(fd,&depth,2);
	//打印图片的宽度高度和色深
	printf("%d %d %d\n",width,height,depth);
	//计算像素每行需要填充的字节数
	int laizi =( 4-(width * depth / 8) % 4) % 4;
	//定义一个字符数组用于存储像素点
	unsigned char color_buf[height*(width*depth/8+laizi)];//32 24
	char color_a = 0,color_r,color_g,color_b;//颜色分量
	unsigned int color;//像素点的颜色--4bit(a_r_g_b)
	//定义一个字符指针指向字符数组
	unsigned char *p = color_buf;
	//将光标定位到bmp文件中存储像素数据的位置
	lseek(fd,0x36,SEEK_SET);
 
	int r;
	//从bmp文件中读取像素到字符数组中
	r=read(fd,color_buf,height*(width*depth/8+laizi));
	printf("practical = %d with = %d\n",r,height*(width*depth/8+laizi));
	//从下往上,从左往右遍历
	for(int i=height-1;i>=0;i--)  //480--行遍历
	{
		for(int j=0;j<width;j++)  //800--列遍历
			{
				/*
				由于 BMP 图像文件中像素数据按照 BGR 或 BGRA 的顺序存储
				所以代码需要按照这个顺序依次读取蓝色、绿色、红色和透明度分量
				以正确解析图像的颜色信息
				*/
				color_b= *p++; //取蓝色
				color_g= *p++; //取绿色
				color_r= *p++; //取红色
				if(32 == depth)  //如果是32位,取色深
				{
					color_a= *p++;
				}
				//屏幕需要的颜色a r g b
				color = color_a << 24 | color_r << 16 |color_g << 8 | color_b;
				Display(color, j, i);  //从左往右,从下往上
			}
			p += laizi;  //加上补充的字节数,结束当前行
	}
}

//画黑线(线上的所有像素点都为黑),画成11条横线,19条竖线
void Dis_pan()//棋盘
{
	//遍历整个屏幕的像素点
	for(int i=0;i<480;i++)
	{
		for(int j = 0;j<800;j++)
		{
			//如果在横线或者竖线上
			if(i%40 == 0||j%40 == 0)
			//给像素点赋值为黑
			Display(0x00, j, i);
			else
			{
			//给像素点赋值为白
			Display(0xffff, j, i);
			}
		}
	}
}
 
/*void Draw_Ck(int x0,int y0,int color)
{
	int flag;
	for(int i= 0;i<480;i++)
		{
			for(int j=0;j<800;j++)
			{
			    if((j-x0)*(j-x0)+(i-y0)*(i-y0)<=10*10)
			    {
			    	if(flag)
					Display(0x0000ff,j,i);
					else
					Display(0xffffff, j, i);
				}
			}
		}		
}*/